package code.whmmm.util.collection;

import code.whmmm.util.simple.JavaWarning;
import code.whmmm.util.simple.ValueWrapper;

import java.util.LinkedHashMap;

/**
 * <p><b>
 *
 * </b></p>
 * <br/>
 *
 * @author Zero
 * @date 2019/10/8 22:03
 */
public class LinkedWrappedMap<K, V> extends LinkedHashMap<K, V> {


    public LinkedWrappedMap() {
        super();
    }

    public LinkedWrappedMap(int initSize) {
        super(initSize);
    }

    /**
     * 如果 值 为 null ,返回  ""
     *
     * @param key 键
     * @return string
     */
    public String getString(Object key) {
        return ValueWrapper.getString(
                get(key)
        );
    }

    /**
     * 如果 为 null 则返回 0 !
     *
     * @param key 键
     * @return int
     */
    public int getInt(Object key) {
        return ValueWrapper.getInt(
                get(key)
        );
    }

    /**
     * 为 null 返回 0L
     *
     * @param key 键
     * @return 值
     */
    public long getLong(Object key) {
        return ValueWrapper.getLong(get(key));
    }

    /**
     * 为 null 返回 0L
     *
     * @param key 键
     * @return 值
     */
    public double getDouble(Object key) {
        return ValueWrapper.getDouble(
                get(key)
        );
    }

    /**
     * 为 null 返回 0L
     *
     * @param key 键
     * @return 值
     */
    public float getFloat(Object key) {
        return ValueWrapper.getFloat(get(key));
    }

    /**
     * 获取对象 , 非常可能报错!!!...请不要使用此方法
     *
     * @param key    键
     * @param tClass 类字节码
     * @param <T>    类型
     * @return T instance
     */
    @SuppressWarnings(JavaWarning.UNCHECKED)
    public <T> T getObject(Object key, Class<T> tClass) {
        Object o = get(key);

        return (T) o;
    }

    /**
     * 如果 对应的键值为空,那么返回 defaultValue
     *
     * @param <T>          类型
     * @param k            键
     * @param defaultValue 默认值
     * @return
     */
    @SuppressWarnings(JavaWarning.UNCHECKED)
    public <T> T get(Object k, T defaultValue) {
        T v = (T) this.get(k);
        if (v == null) {
            v = defaultValue;
        }
        return v;
    }


    public V getNotNull(Object key) {
        V v = this.get(key);
        if (v == null) {
            v = this.get("default_not_null_value");
        }
        return v;
    }

}
